person = {"name":"郝健成","age":65,"sex":"女"}
# 访问字典
# print(person)
# print(person[0]) # 不支持索引访问
# print(person['name'])# 通过key来访问它的value
# person1 = {"name":"郝健成","age":65,"sex":"女","name":"好健康"}
# print(person1) # 有重复的key的话，打印是访问最后一组
# 创建字典，key可以是任何不可变的数据类型
a = {0:"100"} # 通过int类型来去创建字典的key，可以创建成功
b = {(1,):"好健康"} # 通过tuple类型来去创建字典的key，可以创建成功
# print(b)
# print(a)
# 创建字典，key不能是可变的数据类型
# c = {[1,2,3]:"好健康"} # 用来列表当成key
# print(c) # TypeError: unhashable type: 'list'
# e = {{"name":"小白"}:"好健康"} # 用来字典当成key
# print(e) # TypeError: unhashable type: 'dict'
# 使用dict创建字典(dict是字典的关键字)
bb = dict(name="小成",age=18,sex="男")
# print(bb)
# 创建空的字典对象
"""cc = dict()
cc1 = {}
print(cc)
print(cc1)"""
# 通过zip创建字典对象
"""k = ['name','age','job']
v = ['郝健成',87,'软件测试']
d = dict(zip(k,v)) # 通过zip方法把两个列表放到一起，结合dict转成字典对象
print(d)"""
# 通过fromkeys创建值为空的字典
"""b1 = dict.fromkeys(['name','age','job']) # 列表里所有的内容当成了字典的key
print(b1) # {"name":None,"age":None,"job":None} """
# 字典_增删改查

# todo:查找数据
dict_obj = {"姓名":"好健康","年龄":89,"地址":"辽宁沈阳"}
# print(dict_obj["姓名"]) # 好健康
# print(dict_obj[0]) # 会报错，不存在的key KeyError: 0

# # 通过get方法找到存在的可以直接返回
# print(dict_obj.get("年龄", "年龄不存在"))
# print(dict_obj.get("88", "年龄不存在")) # 通过get方法找到不存在的，返回兜底

# 列出字典的所有键值对，最外面是列表，里面是元组
# print(dict_obj.items())
# print(list(dict_obj.items()))  # 直接转成列表对象

# 列出所有的键，键？   键就是key值
# print(dict_obj.keys()) # 返回所有的key值
# print(list(dict_obj.keys())) # 返回所有的key值，返回为列表对象

# 列出所有的vlaue
# print(dict_obj.values())
# print(list(dict_obj.values()))

# len() 检索字典的长度
# print(len(dict_obj)) # 长度为3

# 方法一：检查key是否存在于字典
"""if "姓名" in dict_obj: # 默认去做判断，比较的就是字典的key
    print("姓名这个key在字典里")
else:
    print("姓名这个key不在字典里")"""
# 方法二：检查key是否存在于字典
"""if "姓名" in list(dict_obj.keys()): # .keys() 表示的是方法，方法都需要带小括号才可以
    print("姓名这个key在字典里")
else:
    print("姓名这个key不在字典里")"""

# 检查value是否存在于字典
"""if "好健康" in list(dict_obj.values()): # 需要拿到value才可以做判断
    print("好健康存在于字典value里")
else:
    print("好健康不存在于字典value里")"""

# 添加数据
"""new_dict = {"姓名":"好简称"} # 只有一对键值
new_dict['age'] = 17  # 直接用不存在的键值对会直接添加成功
print(new_dict) # {"姓名":"好简称","age":17}
# 使用update方法来去新增键值对
new_dict.update({"地址":"辽宁省沈阳市旭辉中心B座2901","爱好":"打游戏"}) # update方法里面可以直接写上要添加的键值对（字典形式）
print(new_dict)# {"姓名":"好简称","age":17,"地址":"辽宁省沈阳市旭辉中心B座2901"}"""

# 删除数据
# 使用pop删除：根据字典的key进行删除
dict1 = {"姓名":"郝简称","年龄":89,"爱好":"蹦迪"}
"""result = dict1.pop("年龄") # result会返回删除掉的value值
print(dict1) # 原来的字典
print(result) # 删除的值"""

# 使用popitem：随机删除一组key和value（默认删除最后一个）
# dict1.popitem()
# print(dict1)

# del删除：这个是python的方法，不是dict的方法。 删除键值对
# del dict1['姓名']
# print(dict1)

# clear：清空整个字典
# dict1.clear()
# print(dict1) # {} 空字典

# 修改数据
"""bb1 = {"姓名":"好健康","name":"好简称","age":89}
bb1['姓名'] = "郝健成" # 用这个方法；如果key存在则是修改，如果key不存在则是新增
print(bb1)"""

# 遍历访问字典
student_info = {"姓名":"张三","年龄":26,"地址":"辽宁省沈阳市旭辉"}
# 第一种方式，直接遍历字典
"""for i in student_info:
    # todo： 直接遍历，是访问它的key值
    # 第一次循环：i的值是 姓名
    # 第二次循环：i的值是 年龄
    # 第三次循环：i的值是 地址
    print(i)"""

# 第二种方式:通过字典获取所有key值方法进行遍历
"""for key in student_info.keys(): # 
    # 第一次循环，key的值是   姓名
    # 第二次循环，key的值是   年龄
    # 第三次循环，key的值是   地址
    print(key)"""

# 第三种方式：遍历访问字典的所有key和value
"""for key,value in student_info.items():
    # 把循环变量定义成两个
    # key 对应着每一次循环的键值，value对应着每一次循环的值
    # 第一次循环 key的值是：姓名  value值是  张三
    # 第二次循环 key的值是：年龄  value值是  26
    # 第三次循环 key的值是：地址  value值是  辽宁省沈阳市旭辉
    print(key,value)"""

# 第四种方式：遍历访问字典的value值
"""for value in student_info.values():
    # 第一次循环，value值是  张三
    # 第二次循环，value值是  26
    # 第三次循环，value值是  辽宁省沈阳市旭辉
    print(value)"""

# 字典推导式
dict2 = {k:v for k,v in {'name':'龙仔','age':[18]}.items()}
"""
k:v    最终返回在字典里的内容
for k,v  循环开始，k和v是循环变量
in   循环哪个内容？
{'name':'龙仔','age':[18]}：循环遍历这个字典
.items()：把key和value拿出来一起循环
"""
# print(dict2)

# 案例一:统计字符出现的次数_并
"""chars = ['a','c','x','d','p','a','p','a','c']
result = {} # 定义一个空的字典来去接收结果集
for i in chars: # 遍历一下这个列表，把所有的值加进去字典中
    if i in result : # 判断  如果说这个key值在result字典里面的话，就说明出现重复得了
        result[i] += 1 # 重复怎么办？  把value值+1
    else:
        result[i] = 1 # 把所有的key值都初始化先+1"""
# print(result) # 返回所有字符出现的次数
# 打印出最多出现的字符
"""好简称 = max(list(result.values()))#先拿到最大的值，先通过result的values()方法拿到所有的value值，转成列表，再去取出来最大的value值
# 好简称就是最大的值
for key,value in result.items(): # 遍历访问这个字典，通过key和value值进行遍历访问
    if value == 好简称:  # 如果说某一个value值等于了 一开始最大的value值
        print(f"出现最多的字符是：{key},重复次数是：{value}") # 那么就把当前访问的key和value值拿出来打印"""


# 案例二：让用户输入姓名,如果姓名已经存在,提示用户,如果姓名不存在,继续输入年龄,并存入列表里
"""name_dict = {}
num = 0
while True: # 定义了一个死循环，因为不确定用户需要输入几次
    print("请您选择序号是否需要新增姓名：") # 打印展示选项
    print("序号①：新增姓名")# 打印展示选项
    print("序号②：退出程序") # 打印展示选项
    王琳琳 = input("请您先输入选项：") # 让用户自己输入选项
    if 王琳琳 == "1": # 如果用户输入的选项是1的话
        num+=1 # 唯一编号 
        name =  input("请您先输入您的姓名：") # 让用户输入自己的姓名
        if name in name_dict.values(): # 如果说自己的姓名在这个字典的values列表里
            print(f"您输入的：{name}已经存在于系统中") # 那么就会给出提示
        else: # 反之的话，说明之前的字典里面没有这个姓名，那么就可以新增成功
            name_dict['姓名' + str(num)] = name # {"姓名1":"好简称","年龄1":29}  {"姓名2":"好简称","年龄2":29}
            age = input("请输入您的年龄") # 让用户自己输入年龄
            name_dict['年龄' + str(num)] = age # 把年龄这个字段加进去字典里
    else:
        print("欢迎下次光临！") # 如果用户输入的不是1，那么就是退出系统就可以了
        break # 跳出循环 
print(name_dict) # 打印输出所有的字典"""
# 案例二：第二种方法解题
"""name_dict = {} # 用来收集所有的姓名和年龄信息
while True: # 因为不确定用户需要循环几次，所以用了死循环
    print("欢迎来到姓名管理系统！") # 打印 给用户展示
    print("请您输入对应的选项，选择服务：") # 打印 给用户展示
    print("①：新增姓名") # 打印  给用户展示
    print("②：退出系统") # 打印 给用户展示
    _ = input("请输入序号：") # 用户输入序号 选择对应的服务
    if _ == "1": # 如果用户输入的是1
        name = input("请您先输入您要新增的姓名：") # 那么这里需要用户先输入要添加的姓名
        if name in name_dict.keys(): # 遍历访问字典的key，在这里就是每一个姓名
            print(f"您要新增的姓名已经存在了：{name}") # 打印 要新增的姓名已经存在了
        else: # 反之
            age = input("请您输入要新增年龄：") # 可以继续输入年龄
            name_dict[name] = {"年龄":age} # {"好简称":{"年龄":28}} # key就是姓名，value就是年龄
    else:
        print("欢迎下次光临！") # 如果用户输入的不是1，那么退出系统
        break # 跳出循环
print(name_dict) # 打印所有的姓名信息"""



# 字典解包 ：**表示字典解包
c = {"name":"zhang","age":2}
# print(**c) # TypeError: 'name' is an invalid keyword argument for print()
print("Name:{name},age:{age}".format(**c)) # 解包必须要和字典里定义可以一致才行



"""
字典的总结：
1、字典都是{}出现的，里面的内容是key和value成一个键值对，有多个键值对中间逗号隔开
2、字典里面的key必须是不可变的数据类型，否则新建字典会失败
3、字典里面的key如果出现了重复，那么拿到的就是最后一组键值对
4、访问字典可以直接通过key来访问value
5、字典的一些内置方法：
dict.update()  # 可以更新字典内容
dict.values()  # 获取字典里面的所有value值，返回的是一个列表
dict.keys()  # 返回的是字典所有key值，一个列表包括的
dict.items() #返回的是字典键值对，里面列表包含元组，每一个元组就是字典的键值对
6、循环访问字典
6.1、for i in dict:  # 这种方式直接遍历所有的key值
6.2、for key , value in dict.items()  # 遍历访问里面的key和value值
6.3、 for key  in dict.keys() # 遍历访问里面所有的key值
6.4、 for value in dict.values() # 遍历访问里面所有的value值
"""
















